package com.zero.ava.kernel.schedule;

import com.zero.ava.auth.Identity;
import com.zero.ava.kernel.KernelRunnable;
import com.zero.ava.kernel.Priority;
import com.zero.ava.kernel.RecurringTaskHandle;

/**
 * 执行任务
 * 
 */
public interface ScheduledTask {

	/** 标示非周期性任务 */
	int NON_RECURRING = -1;

	/** 标识符表示一个无限超时 */
	int UNBOUNDED = -1;

	/**
	 * 获取一个核心可执行任务
	 * 
	 * @return
	 */
	KernelRunnable getTask();

	/**
	 * 获取任务的拥有者
	 * 
	 * @return
	 */
	Identity getOwner();

	/**
	 * 获取任务的优先级
	 * 
	 * @return
	 */
	Priority getPriority();

	/**
	 * 活动任务的开始时间
	 * 
	 * @return
	 */
	long getStartTime();

	/**
	 * 获得任务的周期时间
	 * 
	 * @return
	 */
	long getPeriod();

	/**
	 * 活动任务尝试执行次数
	 * 
	 * @return
	 */
	int getTryCount();

	/**
	 * 获得任务的超时时间
	 * 
	 * @return
	 */
	long getTimeout();

	/**
	 * 获取最后失败信息
	 * 
	 * @return
	 */
	Throwable getLastFailure();

	/**
	 * 设置优先级
	 * 
	 * @param priority
	 */
	void setPriority(Priority priority);

	/**
	 * 设置超时
	 * 
	 * @param timeout
	 */
	void setTimeout(long timeout);

	/**
	 * 是否是周期性任务
	 * 
	 * @return
	 */
	boolean isRecurring();

	/**
	 * 获得周期任务的handler
	 * 
	 * @return
	 */
	RecurringTaskHandle getRecurringTaskHandle();

	/**
	 * 是否被取消
	 * 
	 * @return
	 */
	boolean isCancelled();

	/**
	 * 取消任务的执行A
	 * 
	 * @param block
	 * @return
	 */
	boolean cancel(boolean block);

}
